package com.kk.springboot_001.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    /**
     * 配置密码编码器，用于对密码进行加密和验证。
     * @return 返回 BCryptPasswordEncoder 实例。
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 配置身份验证提供者，会自动发现并使用定义的 UserDetailsService 和 PasswordEncoder
     * @return 返回 DaoAuthenticationProvider 实例。
     */
    @Bean
    public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
        return authenticationConfiguration.getAuthenticationManager();
    }
    /**
     * 配置安全过滤器链。
     * @param http HttpSecurity 实例。
     * @return 返回 SecurityFilterChain 实例。
     * @throws Exception 异常。
     */
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests(authorize -> authorize
                        .requestMatchers( "/register").permitAll() // 只允许 /register访问
                        .anyRequest().authenticated() // 其他所有请求都需要认证
                )
                .formLogin(form -> form
                        .loginPage("/login")             // 指定自定义登录页面
                        .defaultSuccessUrl("/success")   // **登录成功后跳转的页面**
                        .failureUrl("/login?error")      // **登录失败后重定向回登录页面，并带上 ?error 参数**
                        .permitAll()
                )
                .logout(logout -> logout
                        .logoutUrl("/logout")              // 退出登录的URL
                        .logoutSuccessUrl("/login?logout") // 退出成功后跳转的URL
                        .invalidateHttpSession(true)       // 使Session失效
                        .deleteCookies("JSESSIONID")       // 删除Cookie
                        .permitAll()
                )
               .csrf(csrf -> csrf.disable());


        return http.build();
    }
}
